/*
 * @Descripttion: 应用程序请求中间件，在每次请求时触发。可在配置文件中设置是否启用
 * @version: 
 * @Author: turingchang
 * @Date: 2020-08-23 08:59:54
 * @LastEditors: turingchang
 * @LastEditTime: 2020-08-26 15:40:00
 */



module.exports =(options, app) => {
    return async function authHandler(ctx, next) {
        var ss ='';
        var s ='';
        if(options.enable ===true){
            var token =ctx.header.token;
            if(ctx.app.utils.validator.isNull(token)){
                // ss =`${new Date().toLocaleString()} [${ctx.ip}] [${ctx.method} ${ctx.url}] : ${ctx.app.enums.response_code_enum.invalid_token.msg} \n`;
                // s =ctx.app.config.console.request.style+ss+ctx.app.config.console.request.style;
                // console.log(s.bgMagenta);
                ctx.requestLogger.info(ctx.app.enums.response_code_enum.invalid_token.msg);
                ctx.outError(null,null,ctx.app.enums.response_code_enum.invalid_token);                
            }else{
                //处理token
                //先排除不需要验证 token 的路由
                if (options.allowed.indexOf(ctx.request.url) > -1) {
                    return await next(options);
                }
                var user ={};
                try {
                    user = ctx.app.jwt.verify(token, ctx.app.config.jwt.secret)
                } catch(err) {
                    var msg ='';
                    if(err.name === 'TokenExpiredError'){
                        ctx.requestLogger.info(ctx.app.enums.response_code_enum.token_expired.msg);
                        return ctx.outError(null,null,ctx.app.enums.response_code_enum.token_expired);
                    }else{
                        ctx.requestLogger.info(ctx.app.enums.response_code_enum.invalid_token.msg);
                        return ctx.outError(null,null,ctx.app.enums.response_code_enum.invalid_token);
                    }
                }
                ctx.token =token;
                ctx.user =user;
                await next(options);
                //console.log('token->>>',ctx.app.token);         
            }
        }else{
            await next(options);
        }
        
    };

};